package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 文件输入流，读取文件数据
 */
public class FISDemo {
    public static void main(String[] args) throws IOException {
        /*
            FileInputStream(String filename)
            FileInputStream(File file)
            上述两种构造器创建文件输入流时，如果参数表达的是一个文件则可以正常实例化
            若表达的文件不存在，或表达的是一个目录则会直接抛出异常:FileNotFoundException
            例如:
            FileInputStream fis = new FileInputStream("./fos.123");//当fos.123不存在时
            java.io.FileNotFoundException: .\fos.123 (系统找不到指定的文件。)

            FileInputStream fis = new FileInputStream(".");//当表达的是一个目录时
            java.io.FileNotFoundException: . (拒绝访问。)
         */
        FileInputStream fis = new FileInputStream("./fos.dat");
        /*
            InputStream超类上定义了读取一个字节的方法:(所有的字节输入流都具有该方法)
            int read()
            读取1个字节，并以int形式返回。返回的int值对应的2进制中只有"低八位"是有效的(读取到的字节)
            高24为全部补0.
            如果该方法返回的int值为整数-1(32位2进制都是1)时，则表达流读取到了末尾。


            fos.dat文件数据
            00000001 00000010

            第一次调用:
            int d = fis.read();//读取1个字节

            读取文件数据:
            00000001 00000010
            ^^^^^^^^
            读取的字节

            变量d对应的2进制样子:00000000 00000000 00000000 00000001
                              |--------补充24个0--------| 读取的字节


            第二次调用:
            d = fis.read();//读取1个字节

            读取文件数据:
            00000001 00000010
                     ^^^^^^^^
                     读取的字节

            变量d对应的2进制样子:00000000 00000000 00000000 00000010
                              |--------补充24个0--------| 读取的字节


            第三次调用:
            d = fis.read();//读取1个字节

            读取文件数据:
            00000001 00000010 文件末尾
                              ^^^^^^^^
                              没有字节了

            变量d对应的2进制样子:11111111 11111111 11111111 11111111
                              |----------32位2进制全为1-----------|
         */
        //第一次调用read读取第一个字节
        int d = fis.read();//d的2进制:00000000 00000000 00000000 00000001
        System.out.println(d);//d的十进制:1

        //第二次调用read读取第二个字节
        d = fis.read();//d的2进制:00000000 00000000 00000000 00000010
        System.out.println(d);//d的十进制:2

        //第三次调用read读取第三个字节
        d = fis.read();//d的2进制:11111111 11111111 11111111 11111111
        System.out.println(d);//d的十进制:-1    返回-1表达文件末尾了

        fis.close();






    }
}





